package LeetCode;

public class Code11_maxArea {
//    11. 盛最多水的容器
//    给定一个长度为 n 的整数数组 height 。有 n 条垂线，第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
//
//    找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。
//
//    返回容器可以储存的最大水量。
//
//    说明：你不能倾斜容器。
//
//
//
//    示例 1：
//
//
//
//    输入：[1,8,6,2,5,4,8,3,7]
//    输出：49
//    解释：图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下，容器能够容纳水（表示为蓝色部分）的最大值为 49。
//    示例 2：
//
//    输入：height = [1,1]
//    输出：1
//
//
//    提示：
//
//    n == height.length
//2 <= n <= 105
//            0 <= height[i] <= 104
    /**
     * 解决盛最多水的容器问题
     * 使用双指针法，从两端开始向中间移动，每次移动较短的一条线，以求得最大的容器面积
     *
     * @param height 整数数组，代表每条垂线的高度
     * @return 返回容器可以储存的最大水量
     */
    public static int maxArea(int[] height) {
        // 检查输入数组是否为空或长度为0，如果是，则返回0
        if (height == null || height.length == 0){
            return 0;
        }

        // 初始化左右指针和最大面积变量
        int left = 0;
        int right = height.length - 1;
        int maxArea = 0;

        // 当左指针小于右指针时，执行循环
        while (left < right){
            // 计算当前容器的面积，并与已知最大面积比较，取较大值
            maxArea = Math.max(maxArea, Math.min(height[left], height[right]) * (right - left));

            // 移动指针，策略是移动较短的一条线，以期找到更高的线，从而可能形成更大的容器
            left = (height[left] < height[right]) ? (left + 1) : left;
            right = (height[left] >= height[right]) ? (right - 1) : right;
        }

        // 返回计算得到的最大面积
        return maxArea;
    }


//    public static int maxArea(int[] height) {
//        int maxarea = 0;
//        // 定义左右指针，先保证宽度最长
//        int l = 0;
//        int r = height.length - 1;
//        while(l < r){
//            maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
//            if (height[l] < height[r])
//                l ++;
//            else
//                r --;
//        }
//        return maxarea;
//    }

    public static void main(String[] args) {
        int[] arr = {1,8,6,2,5,4,8,3,7};
        System.out.println(maxArea(arr));
    }
}
